﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using SOAPServices.Dominio;
using SOAPServices.Persistencia;
using System.Messaging;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace SOAPServices
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Cobros" en el código, en svc y en el archivo de configuración a la vez.
    public class Cobros : ICobros
    {
        

        //Invocamos el servicio Vehiculos
        Vehiculos vehiculo = new Vehiculos();

        private TicketDAO ticketDAO = null;
        private TicketDAO TicketDAO
        {
            get
            {
                if (ticketDAO == null)
                    ticketDAO = new TicketDAO();
                return ticketDAO;
            }
        }

        private VehiculoTicketDAO vehiculoTicketDAO = null;
        private VehiculoTicketDAO VehiculoTicketDAO
        {
            get
            {
                if (vehiculoTicketDAO == null)
                    vehiculoTicketDAO = new VehiculoTicketDAO();
                return vehiculoTicketDAO;
            }
        }

        public Ticket generarTicket(DateTime fecha,int codigo)
        {
            // Prueba de obtención de empleado vía HTTP GET
            HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados/" + codigo);
            req2.Method = "GET";
            HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
            StreamReader reader2 = new StreamReader(res2.GetResponseStream());
            string empleadoJson2 = reader2.ReadToEnd();
            JavaScriptSerializer js2 = new JavaScriptSerializer();
            Empleado empleadoObtenido = js2.Deserialize<Empleado>(empleadoJson2);

            Ticket ticketNuevo=new Ticket(){
                Fecha=fecha,
                Empleado=empleadoObtenido,
            };
            return TicketDAO.Crear(ticketNuevo);
        }

        public VehiculoTicket registrarCobro(int placa, int numero, double peaje, double detraccion, double evacion)
        {
            //obtener numero ticket
            Ticket ticketExistente = TicketDAO.Obtener(numero);
            //obtener numero vehiculo
            Vehiculo vehiculoExistente = vehiculo.obtenerVehiculo(placa);
            if (vehiculoExistente.Modelo.Equals("Militar") && detraccion >= 1)
                throw new FaultException<MensajeSOAP>(
                    new MensajeSOAP()
                    {
                        CodigoError = 1,
                        MensajeError = "El vehiculo no esta afecto a detracciones."
                    }, new FaultReason("InsertFail"));
          

            VehiculoTicket nuevoCobro = new VehiculoTicket()
            {
                Vehiculo = vehiculoExistente,
                Ticket = ticketExistente,
                Peaje = peaje,
                Detraccion = detraccion,
                Evacion=evacion,
            };


            //La ruta en la cual se alojarán los mensajes temporalmente
            string rutaDetraccionIn = @".\private$\bancoin";
            //Validacion si es que no existe la cola
            if (!MessageQueue.Exists(rutaDetraccionIn))
                MessageQueue.Create(rutaDetraccionIn);
            //Creacion del objecto mensaje
            MessageQueue colaDetraccionIn = new MessageQueue(rutaDetraccionIn);
            //Creacion del mensaje y modifacion del contenido
            Message mensajeIn = new Message();
            mensajeIn.Label = "Nueva detraccion";
            mensajeIn.Body = new Detraccion() 
            { Placa = placa,
              NumTicket = numero,
              Monto=detraccion};
            //Enviar el mensaje
            colaDetraccionIn.Send(mensajeIn);

            return VehiculoTicketDAO.Crear(nuevoCobro);
        }



        public VehiculoTicket ObtenerDetraccion(int item)
        {
            return VehiculoTicketDAO.Obtener(item);
        }
    }
}
